PHP: html过滤 仅保留指定的标签、属性及CSS样式

适用于前端有限的富文本功能

<?php
function rich_text_filter($content)
{
    $allowTags = array('<br>', '<b>', '<p>', '<i>', '<u>', '<div>', '<strong>', '<img>');   // 允许通过的标签
    $allowAttributes = array('src', 'width', 'style');                                      // 允许通过的html属性
    $allowCss = array("width", "text-align", "font-weight");                                // 允许通过的css属性

    // 删除多余标签  保留特定标签
    $content = strip_tags($content, implode($allowTags));

    // 删除多余数属性 和多余css
    $content = preg_replace("/<\s*/", '<', $content);

    $content = preg_replace_callback("/([a-zA-Z0-9\-]+)=['\"]([^'\"]*)['\"]\s*/i", function ($matches) use ($allowAttributes, $allowCss) {
        if (!isset($matches[1]) || !in_array(trim($matches[1]), $allowAttributes)) {
            return ' ';
        }

        if (trim($matches[1]) === 'style' && isset($matches[2]) && !empty($matches[2])) {
            $styles = $matches[2] . (preg_match("/;$/", $matches[2]) ? '' : ';');
            $styles = preg_replace_callback("/([^:;]+):([^:;]+);/", function ($items) use($allowCss) {
                if (isset($items[1]) && in_array(trim($items[1]), $allowCss)) {
                    return $items[0];
                }
                return '';
            }, $styles);

            return sprintf('style="%s" ', $styles);
        }

        return sprintf(' %s ', $matches[0]);
    }, $content);

    return $content;
}

发表回复

您的电子邮箱地址不会被公开。